package test.events.backingbeans;

import java.io.IOException;
import java.io.Serializable;
import java.util.Iterator;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import com.icesoft.faces.component.ext.HtmlCommandLink;
import com.icesoft.faces.component.ext.HtmlForm;
import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlPanelGrid;
import com.icesoft.faces.component.panelpopup.PanelPopup;

@ManagedBean
@ViewScoped
public class PruebasMBean extends com.icesoft.faces.component.ext.renderkit.CommandLinkRenderer implements Serializable {
	/**
	 * 
	 */
	private static final long	serialVersionUID	= 1L;
	private boolean				panelPopupVisible;
	private String				nombre;
	private String				apellido;
	private String				descripcion;
	private String				nombreToShow;
	private String				apellidoToShow;
	private String				descripcionToShow;
	private PanelPopup			popup;
	private HtmlPanelGrid		grid;
	private HtmlInputText		inputNombre;
	private HtmlForm			formPopup;

	@PostConstruct
	public void init() {
		System.out.println("Entro en el PostContruct");
		this.panelPopupVisible = false;
		this.nombre = new String();
		this.apellido = new String();
		this.descripcion = new String();
		this.nombreToShow = new String();
		this.apellidoToShow = new String();
		this.descripcionToShow = new String();
		this.popup = new PanelPopup();
		this.grid = new HtmlPanelGrid();
		this.inputNombre = new HtmlInputText();
		this.formPopup = new HtmlForm();
	}

	public boolean isPanelPopupVisible() {
		return panelPopupVisible;
	}

	public void setPanelPopupVisible(boolean panelPopupVisible) {
		this.panelPopupVisible = panelPopupVisible;
	}

	public void openPanelPopup() {
		System.out.println("Entro a openPanelPopup()");
		System.out.println("Fase actual: " + FacesContext.getCurrentInstance().getCurrentPhaseId().toString());
		this.clear();
		this.panelPopupVisible = true;
	}

	public void closePanelPopup() {
		System.out.println("Entro a closePanelPopup()");
		System.out.println("Fase actual: " + FacesContext.getCurrentInstance().getCurrentPhaseId().toString());
		//this.clear();
		// System.out.println("Cambio de fase");
		// FacesContext.getCurrentInstance().setCurrentPhaseId(PhaseId.INVOKE_APPLICATION);
		// System.out.println("llamando clear desde closePanelPopup()");
	    this.clear();
		this.panelPopupVisible = false;
	}

	/**
	 * metodo que recibe un componente como un panelPopup por ejemplo, y limpia
	 * las cajas de texto
	 * 
	 * @param parent
	 */
	protected void forceRefresh(UIComponent parent) {
		System.out.println("PanelGrid: " + parent.getId());//
		Iterator<UIComponent> kids = parent.getFacetsAndChildren(); //for (UIComponent uic : parent.getChildren()) {
		while (kids.hasNext()) {
			UIComponent uic = kids.next();
			System.out.println("Hijo de " + parent.getId() + ": " + uic.getId());
			if (uic instanceof UIInput) {
				System.out.println("Input a limpiar: " + uic.getId());
				// UIInput uii = (UIInput) uic;
				UIInput uii = (UIInput) uic;
				uii.setLocalValueSet(false);
				uii.setValue(null);
				uii.setSubmittedValue(null);
				uii.setValid(true);
			}
			forceRefresh(uic);
		}
	}

	public void cancel(ActionEvent event) {
		System.out.println("Entro a cancel()");
		System.out.println("Fase actual: " + event.getPhaseId().toString());
		this.panelPopupVisible = false;
	}

	public void clear() {
		System.out.println("Entro a clear()");
		System.out.println("Fase actual: " + FacesContext.getCurrentInstance().getCurrentPhaseId().toString());
		// Aqui llamamos al metodo que limpia el panelpopup
		this.nombre = null;
		this.apellido = null;
		this.descripcion = null;
		UIComponent component = (UIComponent) FacesContext.getCurrentInstance().getViewRoot().findComponent("formEdit:panelPopupEdit");
		System.out.println("Componente encontrado: " + component.getId());
		this.forceRefresh(component);
		System.out.println("Se limpiaron los campos...");
	}
	
	private UIComponent findComponent(UIComponent parent, String id) {
		if (id.equals(parent.getId())) {
			return parent;
		}
		Iterator<UIComponent> kids = parent.getFacetsAndChildren();
		while (kids.hasNext()) {
			UIComponent kid = kids.next();
			UIComponent found = findComponent(kid, id);
			if (found != null) {
				return found;
			}
		}
		return null;
	}

	public void acept(ActionEvent event) {
		System.out.println("Entro a acept()");
		System.out.println("Fase actual: " + event.getPhaseId().toString());
		System.out.println("Nombre: " + this.nombre);
		System.out.println("Apellido: " + this.apellido);
		this.nombreToShow = this.nombre;
		this.apellidoToShow = this.apellido;
		this.descripcionToShow = this.descripcion;
	}

	public void aceptAction() {
		System.out.println("Entro a aceptAction()");
		System.out.println("Fase actual: " + FacesContext.getCurrentInstance().getCurrentPhaseId().toString());
		this.panelPopupVisible = false;
	}

	public void cancel2() {
		System.out.println("Entro a cancel2()");
		System.out.println("Fase actual: " + FacesContext.getCurrentInstance().getCurrentPhaseId().toString());
		this.panelPopupVisible = false;
	}

	// @Override
	// public void encodeBegin(final FacesContext pContext,
	// final UIComponent pComponent) throws IOException {
	// if (!isStatic(pComponent)) {
	// CustomJavascriptContext.addJavascriptShortcut(pContext, pComponent);
	// }
	// super.encodeBegin(pContext, pComponent);
	// }

	@Override
	public void encodeEnd(final FacesContext pFacesContext, final UIComponent pUiComponent) throws IOException {
		super.encodeEnd(pFacesContext, pUiComponent); // We can now add an
														// <f:attribute
														// name="focus"
														// value="true"/> to a
														// ice:commandButton to
														// set focus
		System.out.println("Entro al focus");
		final String focus = (String) pUiComponent.getAttributes().get("focus");
		if (focus != null && focus.toLowerCase().equals("true")) {
			final HtmlCommandLink commandButton = (HtmlCommandLink) pUiComponent;
			commandButton.requestFocus();
		}
	}

	/**
	 * @return the nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * @param nombre
	 *            the nombre to set
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * @return the apellido
	 */
	public String getApellido() {
		return apellido;
	}

	/**
	 * @param apellido
	 *            the apellido to set
	 */
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	/**
	 * @return the descripcion
	 */
	public String getDescripcion() {
		return descripcion;
	}

	/**
	 * @param descripcion
	 *            the descripcion to set
	 */
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	/**
	 * @return the popup
	 */
	public PanelPopup getPopup() {
		return popup;
	}

	/**
	 * @param popup
	 *            the popup to set
	 */
	public void setPopup(PanelPopup popup) {
		this.popup = popup;
	}

	/**
	 * @return the inputNombre
	 */
	public HtmlInputText getInputNombre() {
		return inputNombre;
	}

	/**
	 * @param inputNombre
	 *            the inputNombre to set
	 */
	public void setInputNombre(HtmlInputText inputNombre) {
		this.inputNombre = inputNombre;
	}

	/**
	 * @return the grid
	 */
	public HtmlPanelGrid getGrid() {
		return grid;
	}

	/**
	 * @param grid
	 *            the grid to set
	 */
	public void setGrid(HtmlPanelGrid grid) {
		this.grid = grid;
	}

	/**
	 * @return the formPopup
	 */
	public HtmlForm getFormPopup() {
		return formPopup;
	}

	/**
	 * @param formPopup
	 *            the formPopup to set
	 */
	public void setFormPopup(HtmlForm formPopup) {
		this.formPopup = formPopup;
	}

	/**
	 * @return the nombreToShow
	 */
	public String getNombreToShow() {
		return nombreToShow;
	}

	/**
	 * @param nombreToShow the nombreToShow to set
	 */
	public void setNombreToShow(String nombreToShow) {
		this.nombreToShow = nombreToShow;
	}

	/**
	 * @return the apellidoToShow
	 */
	public String getApellidoToShow() {
		return apellidoToShow;
	}

	/**
	 * @param apellidoToShow the apellidoToShow to set
	 */
	public void setApellidoToShow(String apellidoToShow) {
		this.apellidoToShow = apellidoToShow;
	}

	/**
	 * @return the descripcionToShow
	 */
	public String getDescripcionToShow() {
		return descripcionToShow;
	}

	/**
	 * @param descripcionToShow the descripcionToShow to set
	 */
	public void setDescripcionToShow(String descripcionToShow) {
		this.descripcionToShow = descripcionToShow;
	}
}
